package vandy.mooc.model.aidl;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import android.util.JsonReader;
import android.util.JsonToken;
/**
* Parses the Json acronym data returned from the Acronym Services API
* and returns a List of JsonAcronym objects that contain this data.
*/
public class AcronymDataJsonParser {
/**
* Used for logging purposes.
*/
private final String TAG =
this.getClass().getCanonicalName();
/**
* Parse the @a inputStream and convert it into a List of AcronymData
* objects.
*/
public List<AcronymExpansion> parseJsonStream(InputStream inputStream)
throws IOException {
// Create a JsonReader for the inputStream.
try (JsonReader reader =
new JsonReader(new InputStreamReader(inputStream,
"UTF-8"))) {
// Log.d(TAG, "Parsing the results returned as an array");
// Handle the array returned from the Acronym Service.
return parseAcronymWebServiceResults(reader);
}
}
/**
* Parse a Json stream and convert it into a List of AcronymData
* objects.
*/
public List<AcronymExpansion> parseAcronymWebServiceResults(JsonReader reader)
throws IOException {
reader.beginArray();
// If the acronym wasn't expanded return null;
if (reader.peek() == JsonToken.END_ARRAY)
return null;
// Create a AcronymData object for each element in the
// Json array.
final List<AcronymExpansion> acronymExpansion =
parseAcronymData(reader);
reader.endArray();
return acronymExpansion;
}
public List<AcronymExpansion> parseAcronymData(JsonReader reader)
throws IOException {
List<AcronymExpansion> acronymExpansion = null;
reader.beginObject();
outerloop:
while (reader.hasNext()) {
String name = reader.nextName();
switch (name) {
case AcronymData.sf_JSON:
// Log.d(TAG, "reading sf field");
reader.nextString();
break;
case AcronymData.lfs_JSON:
// Log.d(TAG, "reading lfs field");
if (reader.peek() == JsonToken.BEGIN_ARRAY)
acronymExpansion = parseAcronymLongFormArray(reader);
break outerloop;
default:
reader.skipValue();
// Log.d(TAG, "weird problem with " + name + " field");
break;
}
}
reader.endObject();
return acronymExpansion;
}
/**
* Parse a Json stream and convert it into a List of AcronymData
* objects.
*/
public List<AcronymExpansion> parseAcronymLongFormArray(JsonReader reader)
throws IOException {
// Log.d(TAG, "reading lfs elements");
reader.beginArray();
final List<AcronymExpansion> acronyms =
new ArrayList<AcronymExpansion>();
while (reader.hasNext())
acronyms.add(parseAcronymExpansion(reader));
reader.endArray();
return acronyms;
}
/**
* Parse a Json stream and return a AcronymExpansion object.
*/
public AcronymExpansion parseAcronymExpansion(JsonReader reader)
throws IOException {
reader.beginObject();
final AcronymExpansion acronymExpansion =
new AcronymExpansion();
while (reader.hasNext()) {
String name = reader.nextName();
switch (name) {
case AcronymExpansion.lf_JSON:
acronymExpansion.setLf(reader.nextString());
// Log.d(TAG, "reading lf " + acronym.getLongForm());
break;
case AcronymExpansion.freq_JSON:
acronymExpansion.setFreq(reader.nextInt());
// Log.d(TAG, "reading freq " + acronym.getFreq());
break;
case AcronymExpansion.since_JSON:
acronymExpansion.setSince(reader.nextInt());
// Log.d(TAG, "reading since " + acronym.getSince());
break;
default:
reader.skipValue();
// Log.d(TAG, "ignoring " + name);
break;
}
}
reader.endObject();
return acronymExpansion;
}
}